using GrapeCity.Forguncy.Commands;
using GrapeCity.Forguncy.Log;
using GrapeCity.Forguncy.Plugin;
using LiteVectorIndex.Engine;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text.Json;
using System.Threading.Tasks;

namespace LiteVectorIndex
{
    [Icon("pack://application:,,,/LiteVectorIndex;component/Resources/Icon.png")]
    [Category("嵌入式向量库")]
    [OrderWeight(801)]
    public class Cluster_Load : Command, ICommandExecutableInServerSideAsync
    {
        [FormulaProperty]
        [DisplayName("集合名")]
        public object KBName { get; set; }

        [FormulaProperty]
        [DisplayName("集合的配置和数据（BASE64格式字符串）")]
        [Description("Gzip压缩后的文本，需包含集合的配置和全部数据。")]
        public object KBBASE64 { get; set; }


        [DisplayName("强制重新加载")]
        [Description("如果不勾选，系统会检查该向量集合是否已经被加载，性能更好；勾选则会强制重新加载。")]
        public bool ForceReload { get; set; } = false;

        public async Task<ExecuteResult> ExecuteAsync(IServerCommandExecuteContext dataContext)
        {
            var name = (await dataContext.EvaluateFormulaAsync(KBName))?.ToString() ?? "";
            var base64 = (await dataContext.EvaluateFormulaAsync(KBBASE64))?.ToString() ?? "";

            if (string.IsNullOrEmpty(name))
            {
                throw new Exception("集合名不能为空，请检查输入。");
            }

            // 优先判断是否需要建立新的集合
            if (CollectionManager.Instance.CollectionExists(name))
            {
                // 先看是否需要重新加载
                if (!ForceReload) {

                    dataContext.Log.AppendLine($"向量集合：{name} 已经被加载，不再重新执行加载动作。");

                    // 直接返回
                    return new ExecuteResult();
                }
            }
            else {

                // 创建一个新的集合，默认使用Cosine距离
                var collection = CollectionManager.Instance.CreateNewCollection(name, MetricType.Cosine, false);

                dataContext.Log.AppendLine($"向量集合：{name} 不存在，已创建一个新的集合，默认使用Cosine距离。");
            }

            // 再判断数据是否为空
            if (!string.IsNullOrEmpty(base64))
            {
                var data = FastSerializer.ToCollectionData(base64);
                var collection = CollectionManager.Instance.LoadCollection(name, data);
                dataContext.Log.AppendLine($"向量集合：{name} 数据加载成功，共 {collection.Count} 条数据，类型：{collection.MetricTypeInUse}，维度：{collection.Dimension}，同一化：{collection.NormalizeOnAddAndQuery}。");
            }
            else
            {
                dataContext.Log.AppendLine($"向量集合：{name} 的数据为空，不再执行任何加载动作。");
            }

            return new ExecuteResult();
        }

        public override string ToString()
        {
            return "嵌入式向量库：加载向量集合";
        }

        public override CommandScope GetCommandScope()
        {
            return CommandScope.ExecutableInServer;
        }

    }
}
